Metalプログラミング
こんにちは、IOSフリーランスエンジニアの永田です。
今回はより複雑なロジックを理解するために、Model I/Oの3Dアセットのインポートとエクスポートのついて詳細を記載します。Model I/Oの情報を一気に書くと超長文になりますので、細分化して記載していきます。 正直これだけの短文でもsource codeと論理を照合していくのは、毎日の実施の積み重ねが必要と思います。Swiftで素晴らしいUI、人工知能を搭載できたら、様々なアプリケーションにシナジーが生まれる事を信じています。なので、毎日実践します。宜しくお願い致します。
こちらはApple参考記事になります。
MetalKit、GLKit、およびSceneKitを統合する共通のインフラストラクチャを使用して3Dモデルをインポート、エクスポート、および操作する。 モデルI / Oフレームワークは、3Dモデル資産および関連リソースのシステムレベルの理解を提供します。 このフレームワークを使用して、一般的なオーサリングツールやゲームエンジンでサポートされているさまざまな業界標準のファイル形式との間でアセットをインポートおよびエクスポートすることができます。 Model I / Oを使用して、モデルやテクスチャデータを生成または処理することもできます。たとえば、サブディビジョンサーフェスを作成したり、アンビエントオクルージョンテクスチャをベイク処理したり、ライトプローブを生成することができます。 モデルI / Oは、MetalKit、GLKit、およびSceneKitフレームワークとデータバッファを共有し、3Dアセットを効率的にロード、処理、レンダリングするのに役立ちます。
サブディビジョンサーフェス
サブディビジョンサーフェス(細分割曲面)とは、ポリゴンメッシュを規則的に分割することで得られる曲面である。この分割操作を細分割手法と呼び、初期のポリゴンメッシュを制御メッシュと呼ぶ。3次元コンピュータグラフィックスの分野で広く用いられている。本来、ポリゴンメッシュの分割操作を無限回繰り返した極限曲面が細分割曲面であるが、数回の分割操作でも十分な近似曲面を生成できる。有機的な形状のモデリングには適しているが、鋭角なエッジの表現は困難であるため、3次元CADでの利用は少ない。bywikipedia
ポリゴンメッシュ
ポリゴンメッシュまたは非構造グリッドとは、3次元コンピュータグラフィックスとソリッドモデリングの多面体オブジェクトの形状を定義する頂点、辺、面の集合のこと。レンダリングを簡素化するため、通常は三角形、四角形または他の単純な凸型のポリゴンで構成されているが、より一般的な凹面の多角形、または穴のあるポリゴンで構成されることがある。 ポリゴンメッシュの研究は、コンピュータグラフィックスや幾何学モデリングの大きなサブ分野である。ポリゴンメッシュの異なる表現は、異なるアプリケーションや目的に合わせて使用されている。メッシュ上で実行される操作にはブール論理、平滑化、簡素化、および多くの他が含まれる場合がある。ネットワークのための表現、"ストリーミング"と"プログレッシブ"メッシュは、ネットワーク上でポリゴンメッシュを送信するために使用される。ポリゴンメッシュは、明示的に表面のみ(ボリュームが暗黙的である)を表現するのに対して、ボリュームメッシュは表面と構造のボリュームの両方を明示的に表現するという点で、ポリゴンメッシュとは別個のものである。ポリゴンメッシュは広くコンピュータグラフィックスで使用されているため、レイトレーシング、衝突検出、および剛体の力学のためのアルゴリズムが存在する。 bywikipedia
MDLAsset
3Dオブジェクトと、変換階層、メッシュ、カメラ、ライトなどの関連情報のインデックス付きコンテナ。 作成する MDLAsset URLからデータをロードしてオブジェクトを作成し、アセットをいくつかのファイル形式のいずれかにエクスポートすることができます。アセットに含まれるオブジェクトにアクセスするには、Fast Enumerationを使用します。 オブジェクト(at :)メソッド、またはサブスクリプトを使用します。アセット内の各オブジェクトは、オブジェクトの階層のルートにすることができます。その階層をトラバースするには、オブジェクトの childrenpropertyにアクセス。アセットには、一連のメッシュモーフなどのタイムド情報が含まれている場合があります。このような場合、資産のframeIntervalpropertyが0以外で、始まる時間 そして終了時間。propertyは、資産データで使用可能なサンプル時間の範囲を示します。アセットに含まれるオブジェクトの場合は、localTransform(atTime :)そしてboundingBox(atTime :)特定の時間サンプルでオブジェクトのプロパティにアクセスします。時間範囲外のサンプルを要求すると、開始サンプルまたは終了サンプルがクランプされます。一部のアセットフォーマットでは、アセットに保存されているサンプル間の時間を補間する連続サンプリングがサポートされています。他の資産フォーマットは離散的です。離散時間情報を有する資産については、資産に格納されたサンプル間のサンプル時間を要求すると直前の時間のデータが返される。
MDLMesh
3Dオブジェクトのレンダリングに使用される頂点バッファデータ用のコンテナ。 メッシュには、1つまたは複数のMDLSubmeshObjectを作ります。 各サブメッシュには、描画のためにメッシュの頂点を結合する方法を記述するインデックスバッファデータと、サブメッシュの意図された表面外観を記述するマテリアル情報が含まれます。 通常、オブジェクト階層をトラバースしてメッシュを取得します。MDLAssetObjectを作成することもできますが、独自の頂点データからメッシュを作成したり、パラメトリックメッシュを作成することもできます。 TheMDLMeshClassは、メッシュを処理して頂点属性を生成したり、照明情報を焼くこともサポートしています。
MDLLight
シーン内の光源を記述するオブジェクトの抽象スーパークラスです。 アセットファイルからライトをロードするときは、MDLAssetClassを作成したり、エクスポート用のアセットを構築するときにライトを作成したりするには、1つ以上の具象サブクラス MDLPhysicallyPlausibleLightは実世界の物理学に基づいたシェーディングモデルで使用するための光源。MDLAreaLightは特定の形状の領域から3Dシーンを照らす光源。 単一の点または方向からシーンを照らす他の光源とは異なり、エリアライトは特定の形状をしています。 領域光の形状は、光のローカル座標空間のxy平面内の2次元図形であり、その照明は、z軸の負の方向に向けられる(その方向から、継承されたinnerConeAngleそしてouterConeAngle Property)。MDLAreaLightとMDLPhotometricLight興味深い形のライトをクラスで記述することができます。 エリアライトはより優れたレンダリングパフォーマンスで実装できるシンプルなデザインを提供し、測光ライトはより複雑な計算量を犠牲にして実際の照明器具をよりよくモデル化するデザインを提供します。
AppStore リリースしているアプリの紹介
こちらは個人として5月にリリースしたアプリケーションで製作期間は約1ヶ月です。
機能は二つのカメラとアルバム機能、画像を他のアプリケーションと共有機能です。
一つ目のカメラは輪郭抽出です。二つ目のカメラは底辺、高さを計測します。
アルバム機能では画面のサイズと角度を計測できます。情報を他のアプリケーションと共有できます。
今後の予定
現在は、webアプリとモバイルアプリを連携したいのでブログから始めました。jsやcssも勉強中です。
現在はIOS3Dエンジンの基盤になるメタルプログラミングの研究を個人的には実施しています。
理由はゲーム以外で3Dアプリは少ないからです。
モバイルパワーと通信パワーが上がるにつれて、3Dプログラミングが増えてくるのはないかと考えています。
次回は、より高度なMetalプログラミングを解説していきます。
直列,同期、並列,非同期処理の確認のため、こちらの記事を更新しました。
Realmデータベース_Swift3.1 Carthageを使用して、ローカル内でマルチスレッドを使用する。
jsやcssも勉強中のため、こちらの記事を作成しました。
RealmFunctionsを試す。
貴重な時間に、お読み下さいましてありがとうございました。